x11: Keep a default X Colormap in every visual to construct windows with
authorBenjamin Otte <otte@redhat.com>
Sun, 29 Aug 2010 15:48:58 +0000 (17:48 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 26 Sep 2010 13:11:33 +0000 (15:11 +0200)
This way, we can specify a colormap when constructing windows. And ew
must do that to avoid BadMatch from XCreateWindow when we use a
different visual.

gdk/x11/gdkprivate-x11.h
gdk/x11/gdkvisual-x11.c
gdk/x11/gdkwindow-x11.c

index 2e2edd4d9e29b2b9ee52aed76f71bca16685890d..87dfaf32c5ef6961e92a80ab95ae431f9c864886 100644 (file)
@@ -56,6 +56,8 @@ struct _GdkCursorPrivate
 void _gdk_x11_error_handler_push (void);
 void _gdk_x11_error_handler_pop  (void);
 
+Colormap _gdk_visual_get_x11_colormap (GdkVisual *visual);
+
 void _gdk_xid_table_insert (GdkDisplay *display,
                            XID        *xid,
                            gpointer    data);
index 051f19ad9147b93f64ab3189c535a2c90eaa5370..a4d639d03ab2303d0981b3cc0efe48d6759ac6e3 100644 (file)
@@ -38,6 +38,7 @@ struct _GdkVisualPrivate
 {
   Visual *xvisual;
   GdkScreen *screen;
+  Colormap colormap;
 };
 
 struct _GdkVisualClass
@@ -70,12 +71,26 @@ static const gchar *const visual_names[] =
 
 G_DEFINE_TYPE (GdkVisual, gdk_visual, G_TYPE_OBJECT)
 
+static void
+gdk_visual_finalize (GObject *object)
+{
+  GdkVisualPrivate *priv = (GdkVisualPrivate *) object;
+
+  if (priv->colormap != None)
+    XFreeColormap (GDK_SCREEN_XDISPLAY (priv->screen),
+                   priv->colormap);
+
+  G_OBJECT_CLASS (gdk_visual_parent_class)->finalize (object);
+}
+
 static void
 gdk_visual_class_init (GdkVisualClass *visual_class)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (visual_class);
 
   g_type_class_add_private (object_class, sizeof (GdkVisualPrivate));
+
+  object_class->finalize = gdk_visual_finalize;
 }
 
 static void
@@ -84,6 +99,8 @@ gdk_visual_init (GdkVisual *visual)
   visual->priv = G_TYPE_INSTANCE_GET_PRIVATE (visual,
                                               GDK_TYPE_VISUAL,
                                               GdkVisualPrivate);
+
+  visual->priv->colormap = None;
 }
 
 void
@@ -241,7 +258,11 @@ _gdk_visual_init (GdkScreen *screen)
   for (i = 0; i < nvisuals; i++)
     {
       if (default_xvisual->visualid == visuals[i]->priv->xvisual->visualid)
-       screen_x11->system_visual = visuals[i];
+         {
+          screen_x11->system_visual = visuals[i];
+           visuals[i]->priv->colormap = DefaultColormap (screen_x11->xdisplay,
+                                                         screen_x11->screen_num);
+         }
 
       /* For now, we only support 8888 ARGB for the "rgba visual".
        * Additional formats (like ABGR) could be added later if they
@@ -632,6 +653,34 @@ gdk_visual_equal (Visual *a,
   return (a->visualid == b->visualid);
 }
 
+/**
+ * _gdk_visual_get_x11_colormap:
+ * @visual: the visual to get the colormap from
+ *
+ * Gets the colormap to use
+ *
+ * Returns: the X Colormap to use for new windows using @visual
+ **/
+Colormap
+_gdk_visual_get_x11_colormap (GdkVisual *visual)
+{
+  GdkVisualPrivate *priv;
+
+  g_return_val_if_fail (GDK_IS_VISUAL (visual), None);
+
+  priv = visual->priv;
+
+  if (priv->colormap == None)
+    {
+      priv->colormap = XCreateColormap (GDK_SCREEN_XDISPLAY (priv->screen),
+                                        GDK_SCREEN_XROOTWIN (priv->screen),
+                                        GDK_VISUAL_XVISUAL (visual),
+                                        AllocNone);
+    }
+
+  return priv->colormap;
+}
+
 /**
  * gdk_x11_visual_get_xvisual:
  * @visual: a #GdkVisual.
index 820b3790b9c7c1477ecc194bc298e63fe37cb889..bbdd0805d04e83e92c4af4d9a78c821f5f2d513a 100644 (file)
@@ -784,7 +784,7 @@ _gdk_window_impl_new (GdkWindow     *window,
       
       xattributes_mask |= CWBitGravity;
 
-      xattributes.colormap = GDK_COLORMAP_XCOLORMAP (draw_impl->colormap);
+      xattributes.colormap = _gdk_visual_get_x11_colormap (private->visual);
       xattributes_mask |= CWColormap;
 
       if (private->window_type == GDK_WINDOW_TEMP)